package com.platform.core.service;

import com.platform.dto.*;
import com.querydsl.core.types.Predicate;
import com.platform.comm.exceptions.RestApiException;
import com.platform.comm.jwt.JwtTokenUtil;
import com.platform.core.entity.SysUser;
import com.platform.dto.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.MultiValueMap;

import java.util.List;
import java.util.Map;

/**
 * Description: 用户-Service接口
 *
 * @author libin
 * Created on 2019/4/18
 **/
public interface SysUserService extends BaseEntityBiz<SysUser> {

    /**
     * 系统默认管理员名称
     */
    String ADMINISTRATOR_CODE = "admin";

    /**
     * 用户默认初始化密码
     */
    String USER_P_INIT_VALUE = "123456";

    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @param accessSubOrg 是否允许访问下级标识
     * @return 列表
     */
    Page<UserQo> queryUsers(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters, String accessSubOrg);


    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    UserDetail findByUsername(String username);

    /**
     * 创建
     *
     * @param userQo 用户对象
     * @return UserQo
     */
    default UserQo create(UserQo userQo) {
        throw new RestApiException("未实现具体业务");
    }

    /**
     * 创建
     *
     * @param userQo 用户对象
     * @return UserQo
     */
    UserQo shareCreate(ExternalUserQo userQo);

    /**
     * 修改
     *
     * @param userQo 用户信息
     * @return UserQo
     */
    default UserQo modify(UserQo userQo) {
        throw new RestApiException("未实现具体业务");
    }

    /**
     * 用户批量导入时存储importId
     *
     * @param userQo 用户信息
     */
    default void modifyImportId(UserQo userQo) {
        throw new RestApiException("未实现具体业务");
    }

    /**
     * 检查用户名是否存在
     *
     * @param id       ID(修改时用)
     * @param username 用户名
     * @return 数目
     */
    long checkUsernameExists(String id, String username);

    /**
     * 验证Email是否存在
     *
     * @param id    ID（修改时用）
     * @param email 邮箱
     * @return Long
     */
    long checkEmailExists(String id, String email);

    /**
     * 验证手机是否存在
     *
     * @param id     ID（修改时用）
     * @param mobile 手机号
     * @return Long
     */
    long checkMobileExists(String id, String mobile);

    /**
     * 验证用户编码是否存在
     *
     * @param id       ID（修改时用）
     * @param userCode 用户编码
     * @return Long
     */
    long checkUserCodeExists(String id, String userCode);

    /**
     * 物理删除
     *
     * @param id 用户Id
     */
    default void delete(String id) {
        throw new RestApiException("未实现具体业务");
    }

    /**
     * 重置密码
     *
     * @param ids 用户ID
     */
    void resetPwd(List<String> ids);

    /**
     * 修改密码
     *
     * @param username 用户名
     * @param pwd      密码
     *
     * @return SysUser 用户
     */
    SysUser modifyPwd(String username, PwdQo pwd);

    /**
     * 记录登录时间
     *
     * @param username 用户名
     */
    void recordLoginDate(String username);

    /**
     * 根据用户ID查询用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    UserQo getByUserId(String userId);

    /**
     * 查询所有在使用用户
     * @return
     */
    List<UserQo>  getByUserAll();

    /**
     * 根据用户ID查询用户信息
     * @param userIds 用户ID
     * @return 用户信息
     */
    List<UserQo> getByUserId(List<String> userIds);

    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 用户信息
     */
    UserQo getByUsername(String username);

    /**
     * 根据用户ID查询用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    Map<String, Object> getByShareUserId(String userId);

    /**
     * 同步用户到子系统
     * @param id 角色id
     */
    void syncSubsystem(String id);

    /**
     * 同步用户到平台
     * @param id 角色id
     */
    void syncPublic(String id);

    /**
     * 根据token 获取用户信息
     * @param token token
     * @return 用户信息
     */
    UserQo getByToken(String token);

    /**
     * 根据token 获取采集用户信息
     * @param user 用户
     * @return 用户信息
     */
    UserInfoQo gatherUserInfo(JwtTokenUtil.JwtUser user);

    /**
     * 根据部门id获取用户id集
     * @param deptId
     * @return
     */
    List<String> queryUserIdsByDeptId(String deptId);

    /**
     * 根据角色类型查询用户
     * @param roleCode
     * @return
     */
    public List<UserQo> queryUserByRole(String roleCode);

    /**
     * 检测手机号是否存在
     * @param id id
     * @param idCode 身份证号
     * @return
     */
    long checkIdCodeExists(String id, String idCode);

    /**
     * 获取用户岗位信息
     * @return
     */
    List<DepartQo> getPostUserInfo();

    /**
     * 根据用户名称获取用户信息
     * @return
     */
     UserQo getUserByUserName(UserQo userQo);

    /**
     * 设置用户职位
     * @param params 参数
     */
    void setPost(Map<String, Object> params);

    /**
     * 查询负责人列表
     * @param pageable 分页参数
     * @param parameters 请求参数
     * @return
     */
    Page<UserQo> searchLeader(Pageable pageable, MultiValueMap<String, String> parameters);

    /**
     * 根据部门id获取用户id
     * @param departId 部门id
     * @param pageable
     * @return 结果
     */
    Page<String> getByDepartId(String departId, Pageable pageable);

    /**
     * 创建非系统用户
     *
     * @param userQo 用户对象
     * @return UserQo
     */
    UserQo createOtherUser(UserQo userQo);
}
